package ventanas;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import com.jgoodies.forms.layout.FormLayout;
import com.jgoodies.forms.layout.ColumnSpec;
import com.jgoodies.forms.layout.RowSpec;
import com.jgoodies.forms.factories.FormFactory;
import controladores.ControladorVentanaTurno;
import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListModel;
import javax.swing.SwingConstants;
import javax.swing.JTextField;
import javax.swing.JList;
import javax.swing.JButton;
import java.awt.Dimension;
import javax.swing.JComboBox;
import negocio.Medico;
import negocio.Paciente;
import negocio.Sistema;
import negocio.Turno;

public class VentanaTurno extends JFrame {
	private static final long serialVersionUID = 1L;
	private JPanel contentPane;
	private final JLabel lblAsignarTurno = new JLabel("Turno");
	private final JLabel lblFechaIzq = new JLabel("Fecha:");
	private final JLabel lblHorarioIzq = new JLabel("Horario:");
	private final JLabel lblPaciente = new JLabel("Paciente:");
	private final JButton btnCancelar = new JButton("Cancelar");
	private VentanaAgenda v;
	private final JLabel lblFechaDer = new JLabel("New label");
	private final JLabel lblHorarioDer = new JLabel("New label");
	private final JTextField txtPacienteBusqueda = new JTextField();
	private final JButton btnConfirmarTurno = new JButton("Confirmar Turno");
	private final JButton btnBuscarPaciente = new JButton("Buscar");
	private ControladorVentanaTurno controlador;
	private final JList<Paciente> lista = new JList<Paciente>();
	private final JLabel lblMdicoIzq = new JLabel("M\u00E9dico:");
	private final JLabel lblMedicoDer = new JLabel("New label");
	private final JLabel lblEstadoDelTurno = new JLabel("Estado del Turno");
	private final JComboBox<String> comboEstadoDelTurno = new JComboBox<String>();
	private Paciente delTurno;
	private Sistema s;
	
	public VentanaTurno(VentanaAgenda ventana) {
		setTitle("Turno");
		this.delTurno = new Paciente();
		this.s = Sistema.obtenerInstancia();
		this.setMinimumSize(new Dimension(300, 300));
		this.txtPacienteBusqueda.setColumns(10);
		this.v = ventana;
		this.controlador = new ControladorVentanaTurno(this);
		this.initGUI();
		this.agregarListeners();
		this.cargarEstadosAlCombo();
		this.cargarDatosPrevios();
	}
	
	private void initGUI() {
		setBounds(100, 100, 641, 348);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(new FormLayout(new ColumnSpec[] {
				ColumnSpec.decode("max(73dlu;default)"),
				FormFactory.RELATED_GAP_COLSPEC,
				ColumnSpec.decode("max(143dlu;default):grow"),
				FormFactory.RELATED_GAP_COLSPEC,
				ColumnSpec.decode("max(65dlu;min)"),},
			new RowSpec[] {
				FormFactory.RELATED_GAP_ROWSPEC,
				FormFactory.DEFAULT_ROWSPEC,
				FormFactory.RELATED_GAP_ROWSPEC,
				FormFactory.DEFAULT_ROWSPEC,
				FormFactory.RELATED_GAP_ROWSPEC,
				FormFactory.DEFAULT_ROWSPEC,
				FormFactory.RELATED_GAP_ROWSPEC,
				FormFactory.DEFAULT_ROWSPEC,
				FormFactory.RELATED_GAP_ROWSPEC,
				FormFactory.DEFAULT_ROWSPEC,
				FormFactory.RELATED_GAP_ROWSPEC,
				FormFactory.DEFAULT_ROWSPEC,
				FormFactory.RELATED_GAP_ROWSPEC,
				RowSpec.decode("default:grow"),
				FormFactory.RELATED_GAP_ROWSPEC,
				FormFactory.DEFAULT_ROWSPEC,}));
		lblAsignarTurno.setHorizontalAlignment(SwingConstants.CENTER);
		contentPane.add(lblAsignarTurno, "3, 2");
		lblFechaIzq.setHorizontalAlignment(SwingConstants.CENTER);
		contentPane.add(lblFechaIzq, "1, 4");
		lblFechaDer.setHorizontalAlignment(SwingConstants.CENTER);
		contentPane.add(lblFechaDer, "3, 4");
		lblHorarioIzq.setHorizontalAlignment(SwingConstants.CENTER);
		contentPane.add(lblHorarioIzq, "1, 6");
		lblHorarioDer.setHorizontalAlignment(SwingConstants.CENTER);
		contentPane.add(lblHorarioDer, "3, 6");
		lblMdicoIzq.setHorizontalAlignment(SwingConstants.CENTER);
		contentPane.add(lblMdicoIzq, "1, 8");
		lblMedicoDer.setHorizontalAlignment(SwingConstants.CENTER);
		contentPane.add(lblMedicoDer, "3, 8");
		lblEstadoDelTurno.setHorizontalAlignment(SwingConstants.CENTER);
		contentPane.add(lblEstadoDelTurno, "1, 10, right, default");
		contentPane.add(comboEstadoDelTurno, "3, 10, fill, default");
		lblPaciente.setHorizontalAlignment(SwingConstants.CENTER);
		contentPane.add(lblPaciente, "1, 12, center, default");
		contentPane.add(txtPacienteBusqueda, "3, 12, fill, default");
		contentPane.add(btnBuscarPaciente, "5, 12");
		contentPane.add(lista, "3, 14, fill, fill");
		contentPane.add(btnCancelar, "1, 16");
		contentPane.add(btnConfirmarTurno, "3, 16");
		this.setVisible(true);
		this.setLocationRelativeTo(null);
		this.pack();
	}
	
	public void cargarDatosPrevios(){
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		SimpleDateFormat sdf2 = new SimpleDateFormat("HH:mm");
		
		Date fecha = this.v.getCalendario().getDate();
		String fechaConvertida =  sdf.format(fecha);
		String horario = this.v.getSelectedTime();
		String medicoString = v.getCombo().getSelectedItem().toString();
		lblFechaDer.setText(fechaConvertida);
		lblHorarioDer.setText(horario);
		lblMedicoDer.setText(medicoString);
		
		Medico medico = (Medico)v.getCombo().getSelectedItem();
		Calendar c = Calendar.getInstance();
		c.setTime(fecha);
		try {
			Calendar aux = Calendar.getInstance();
			aux.setTime(sdf2.parse(horario));
			c.set(Calendar.HOUR_OF_DAY, aux.get(Calendar.HOUR_OF_DAY));
			c.set(Calendar.MINUTE, aux.get(Calendar.MINUTE));
			Turno t = s.obtenerTurnoEnFechaYhora(medico, c);
			
			if(t!=null && t.getPaciente()!=null){
				txtPacienteBusqueda.setText(t.getPaciente().toString());
				this.delTurno = t.getPaciente();
				comboEstadoDelTurno.setSelectedItem(t.getEstado());
			}
		} catch (ParseException e) {
			e.printStackTrace();
		}	
	}
	
	public void agregarListeners(){
		this.btnBuscarPaciente.addActionListener(controlador);
		this.btnConfirmarTurno.addActionListener(controlador);
		this.btnCancelar.addActionListener(controlador);
		this.lista.addMouseListener(controlador);
	}
	
	public void cargarEstadosAlCombo(){
		DefaultComboBoxModel<String> modelo = new DefaultComboBoxModel<>();
		modelo.addElement("Disponible");
		modelo.addElement("Asignado");
		modelo.addElement("Cancelado");
		modelo.addElement("Concretado");
		modelo.addElement("Ausente");
		comboEstadoDelTurno.setModel(modelo);
		comboEstadoDelTurno.revalidate();
	}
	
	public boolean hayTurnoSeleccionado(){
		String txt = txtPacienteBusqueda.getText();
		DefaultListModel<Paciente> modelo = (DefaultListModel<Paciente>) lista.getModel();
		
		for(int i=0; i<modelo.getSize(); i++)
			if(modelo.get(i).toString().equals(txt))
				return true;
		return false;
	}
	
	//getters y setters
	public JButton getBtnCancelar() {
		return btnCancelar;
	}
	
	public JButton getBtnConfirmarTurno() {
		return btnConfirmarTurno;
	}
	
	public JButton getBtnBuscarPaciente() {
		return btnBuscarPaciente;
	}
	
	public JTextField getTxtPacienteBusqueda() {
		return txtPacienteBusqueda;
	}
	
	public JList<Paciente> getLista() {
		return lista;
	}
	
	public JLabel getLblFechaDer() {
		return lblFechaDer;
	}
	
	public JLabel getLblHorarioDer() {
		return lblHorarioDer;
	}
	
	public VentanaAgenda getV() {
		return v;
	}
	
	public JLabel getLblMedicoDer() {
		return lblMedicoDer;
	}
	
	public JComboBox<String> getComboEstadoDelTurno() {
		return comboEstadoDelTurno;
	}
	
	public Paciente getDelTurno() {
		return delTurno;
	}
	
	public void setDelTurno(Paciente delTurno) {
		this.delTurno = delTurno;
	}
}
